<?php
/**
 * @author		João Batista Neto
 * @brief		Classes e interfaces utilitárias
 * @package		rpo.util
 */

require_once 'rpo/util/ObjectIterator.php';

/**
 * @brief	Implementação simples de um Iterator recursivo
 * @class	 RecursiveObjectIterator
 */
abstract class RecursiveObjectIterator extends ObjectIterator implements RecursiveIterator {
	/**
	 * @brief	Verifica se um objeto é aceitável para o Iterator antes de adicioná-lo
	 * @return	boolean
	 */
	protected function accept( IObject $object ){
		return $object->getClass()->isSubclassOf( 'ObjectStorage' );
	}

	/**
	 * @brief	Executa o passo de mapeamento
	 * @param	$step MapStep Objeto que fará o mapeamento
	 */
	protected function doMap( MapStep $step  ){
		$iterator = $this->getRecursiveIterator();

		for ( $iterator->rewind() ; $iterator->valid() ; $iterator->next() ){
			$step->map( $this , $iterator->key() , $iterator->current() );
		}
	}

	/**
	 * @brief	Verifica se o item atual possui filhos
	 * @return	boolean
	 * @see		RecursiveIterator.hasChildren()
	 */
	public function hasChildren(){
		return $this->current()->count();
	}

	/**
	 * @brief	Recupera uma instância de um Iterator recursivo de iteratores
	 * @return	RecursiveObjectIteratorIterator
	 */
	abstract public function getRecursiveIterator();
}